/**
 * 动态规划，二维数组可以先递归物品或背包。一维数组如果先递归物品时组合，先递归背包容量是排列（顺序不同为不同的组合）
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var combinationSum4 = function(nums, target) {
    let dp = new Array(target+1).fill(0);
    dp[0] = 1;
    for(let i = 0;i<=target;i++){
        for(let j = 0;j<nums.length;j++){
            if(i >= nums[j]){
                dp[i] += dp[i - nums[j]]
            }
        }
    }
    return dp[target]
};


// nums = [1,2,3]
// target = 4
// dp = [ 1, 1, 2, 4, 7 ]

// 若先遍历物品（组合）
// dp = [ 1, 1, 2, 3, 4 ]
